package khl.ooo.domain.vak;

import java.util.HashSet;


public class Vak implements Cloneable{
	private String code;
	private String naam;
	private int credits;
	private int aantalMinutenPerWeek;
	private HashSet<Vak> volgtijdelijkheid;
	
	public Vak(String code, String naam, int credits, int aantalMinutenPerWeek) {
		this.setCode(code);
		this.setNaam(naam);
		this.setCredits(credits);
		this.setAantalMinutenPerWeek(aantalMinutenPerWeek);
		this.volgtijdelijkheid = new HashSet<Vak>();
	}

	public String getCode() {
		return this.code;
	}

	private void setCode(String code) {
		if((code != "") && (code != null))
			this.code = code;
		else
			throw new IllegalArgumentException();
	}

	public String getNaam() {
		return this.naam;
	}

	public void setNaam(String naam) {
		if((naam != "") && (naam != null))
			this.naam = naam;
		else
			throw new IllegalArgumentException();
	}

	public int getCredits() {
		return this.credits;
	}

	public void setCredits(int credits) {
		if(credits >= 1 && credits <= 5)
			this.credits = credits;
		else
			throw new IllegalArgumentException();
	}

	public int getAantalMinutenPerWeek() {
		return this.aantalMinutenPerWeek;
	}

	public void setAantalMinutenPerWeek(int aantalMinutenPerWeek) {
		// 7d x 24u x 60m = max 10080 minuten per week 
		if(aantalMinutenPerWeek >= 1 && aantalMinutenPerWeek <= 10080)
			this.aantalMinutenPerWeek = aantalMinutenPerWeek;
		else
			throw new IllegalArgumentException();
	}
	
	public void setVolgtijdelijkheid(HashSet<Vak> vakken) {
		if(vakken != null) {
			this.volgtijdelijkheid = vakken;
		} else {
			throw new IllegalArgumentException();
		}
	}
	
	public boolean equals(Vak vak) {
		if(vak != null && vak instanceof Vak) {
			return this.getCode() == vak.getCode(); 
		} else
			return false;
	}
	
	public HashSet<Vak> getVolgtijdelijkheid() {
		return this.volgtijdelijkheid;
	}
	
	public void voegVolgtijdelijkheidToe(Vak vak) {
		if(vak != null) {
			if(this.getVolgtijdelijkheid().size() > 0) {
				if(!(this.getVolgtijdelijkheid().contains(vak))) { //TODO overbodig
					this.volgtijdelijkheid.add(vak);
				} 
			} else {
				this.volgtijdelijkheid.add(vak);
			}
		} else {
			throw new IllegalArgumentException();
		}
	}
	
	public int compareTo(Vak vak) {
		if(vak != null && vak instanceof Vak) {
			return this.getCode().compareTo(vak.getCode());
		} else {
			throw new IllegalArgumentException();
		}
	}
	
	public String toString() {
		/*
		 * String expected = nieuweNaam + " (" + nieuweCode + ")\n" + nieuweCredits
					+ " credits\n" + nieuwAantalMinuten
					+ " contactminuten per week";
		 */
		String output = "";
		output += 
			this.getNaam() + " (" + this.getCode() + ")\n" + 
			this.getCredits() + " credits\n" + 
			this.getAantalMinutenPerWeek() + " contactminuten per week";
		return output;
	}
}
